package com.ck.company.service.impl;

import com.ck.common.service.OperationLogService;
import com.ck.company.service.CpProgramTemplateService;
import com.ck.config.CustomProperties;
import com.ck.constant.JsonDataTypeEnum;
import com.ck.constant.ModuleConstant;
import com.ck.constant.ProgramTemplateTypeEnum;
import com.ck.dao.JsonDataMapper;
import com.ck.dao.ProgramTemplateMapper;
import com.ck.exception.ServiceException;
import com.ck.model.common.JsonData;
import com.ck.model.common.ProgramTemplate;
import com.ck.model.common.sys.LoginUser;
import com.ck.model.company.vo.CpProgramTemplateVO;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 节目模板
 *
 * @author linqiang
 * @version v1.0
 * @date 2018-09-11 11:47
 */
@Service("cpProgramTemplateService")
public class CpProgramTemplateServiceImpl implements CpProgramTemplateService {

    @Autowired
    private ProgramTemplateMapper programTemplateMapper;
    @Autowired
    private OperationLogService operationLogService;
    @Autowired
    private JsonDataMapper jsonDataMapper;
    @Autowired
    private CustomProperties customProperties;

    /**
     * 分页查询
     *
     * @param companyCode  商家编码
     * @param templateName 模板名称
     * @param type         模板类型
     * @param pageNum      当前页
     * @param pageSize     每页条数
     * @return Page<CpProgramTemplateVO>
     */
    @Override
    public Page<CpProgramTemplateVO> listByPage(String companyCode, String templateName, Integer type, Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        return programTemplateMapper.listByPage(companyCode, templateName, type);
    }

    /**
     * 根据主键删除模板
     *
     * @param programTemplateId 主键
     * @param loginUser         登录用户信息
     * @return 影响行数
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int deleteByPrimaryKey(Long programTemplateId, LoginUser loginUser) {
        int row = 0;
        ProgramTemplate programTemplate = selectByPrimaryKey(programTemplateId);
        if (null != programTemplate) {
            if (programTemplate.getType().equals(ProgramTemplateTypeEnum.SYSTEM_TEMP.getType())) {
                return -1;
            }
            row = programTemplateMapper.deleteByPrimaryKey(programTemplateId);
            operationLogService.saveSuccessOperationLog(("删除节目模板，模板名称为:" + programTemplate.getName()),
                    (ModuleConstant.MODULE_PROGRAM + "-" + ModuleConstant.MODULE_PROGRAM_TEMPLATE),
                    loginUser.getUser(), loginUser.getIp());
        }
        return row;
    }

    /**
     * 新增节目模板
     *
     * @param programTemplate 模板
     * @param loginUser       登录用户
     * @return 影响行数
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public Long insert(ProgramTemplate programTemplate, LoginUser loginUser) {
        programTemplate.setAddTime(System.currentTimeMillis());
        programTemplateMapper.insert(programTemplate);
        operationLogService.saveSuccessOperationLog(("新增节目模板，模板名称为:" + programTemplate.getName()),
                (ModuleConstant.MODULE_PROGRAM + "-" + ModuleConstant.MODULE_PROGRAM_TEMPLATE),
                loginUser.getUser(), loginUser.getIp());
        return programTemplate.getProgramTemplateId();
    }

    @Override
    public ProgramTemplate selectByPrimaryKey(Long programTemplateId) {
        return programTemplateMapper.selectByPrimaryKey(programTemplateId);
    }

    /**
     * 修改指定字段值
     *
     * @param programTemplate 模板
     * @param loginUser       登录用户信息
     * @return 影响行数
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int updateByPrimaryKeySelective(ProgramTemplate programTemplate, LoginUser loginUser) {
        int row = 0;
        programTemplate.setUpdateTime(System.currentTimeMillis());
        row = programTemplateMapper.updateByPrimaryKeySelective(programTemplate);
        operationLogService.saveSuccessOperationLog(("修改节目模板，模板名称为:" + programTemplate.getName()),
                (ModuleConstant.MODULE_PROGRAM + "-" + ModuleConstant.MODULE_PROGRAM_TEMPLATE),
                loginUser.getUser(), loginUser.getIp());
        return row;
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public int updateByPrimaryKey(ProgramTemplate record) {
        return programTemplateMapper.updateByPrimaryKey(record);
    }

    /**
     * 根据名称查询
     *
     * @param name 模板名称
     * @return ProgramTemplate
     */
    @Override
    public ProgramTemplate selectByName(String name) {
        return programTemplateMapper.selectByName(name);
    }

    /**
     * 新增模板
     *
     * @param name         模板名称
     * @param json         模板内容
     * @param screenWidth  模板宽
     * @param screenHeight 模板高
     * @param backupImgUrl 背景图
     * @param loginUser    登录用户信息
     * @return
     */
    @Override
    public Long save(String name, String json, Integer screenWidth, Integer screenHeight, String backupImgUrl, LoginUser loginUser) {
        JsonData jsonData = new JsonData();
        jsonData.setJsonContent(json);
        jsonData.setType(JsonDataTypeEnum.TEMPLATE_JSON.getType());
        jsonData.setAddTime(System.currentTimeMillis());
        jsonDataMapper.insert(jsonData);

        ProgramTemplate programTemplate = new ProgramTemplate();
        programTemplate.setName(name);
        programTemplate.setWide(screenWidth);
        programTemplate.setHeight(screenHeight);
        if (StringUtils.isBlank(backupImgUrl)) {
            programTemplate.setImgUrl(customProperties.getProgramTemplateDefaultBackgroundUri());
        } else {
            programTemplate.setImgUrl(backupImgUrl);
        }
        programTemplate.setType(ProgramTemplateTypeEnum.USER_TEMP.getType());
        programTemplate.setJsonId(jsonData.getJsonId());
        programTemplate.setAddTime(System.currentTimeMillis());
        programTemplate.setCompanyCode(loginUser.getUser().getCompanyCode());
        programTemplateMapper.insert(programTemplate);

        operationLogService.saveSuccessOperationLog(("新增节目模板，模板名称为:" + programTemplate.getName()),
                (ModuleConstant.MODULE_PROGRAM + "-" + ModuleConstant.MODULE_PROGRAM_TEMPLATE),
                loginUser.getUser(), loginUser.getIp());
        return programTemplate.getProgramTemplateId();
    }

    /**
     * 修改模板
     *
     * @param templateId 模板ID
     * @param json       内容
     * @param imgUrl     背景图片
     * @param name       模板名称
     * @param loginUser  登录用户信息
     * @return 影响行数
     * @throws ServiceException
     */
    @Override
    public int update(Long templateId, String json, String imgUrl, String name, LoginUser loginUser) throws ServiceException {
        int row = 0;
        ProgramTemplate programTemplate = programTemplateMapper.selectByPrimaryKey(templateId);
        if (null == programTemplate) {
            throw new ServiceException("模板不存在或已被删除");
        }
        JsonData jsonData = jsonDataMapper.selectByPrimaryKey(programTemplate.getJsonId());
        if (null != jsonData) {
            jsonData.setJsonContent(json);
            jsonDataMapper.updateByPrimaryKey(jsonData);
        } else {
            jsonData = new JsonData();
            jsonData.setJsonContent(json);
            jsonData.setType(JsonDataTypeEnum.TEMPLATE_JSON.getType());
            jsonData.setAddTime(System.currentTimeMillis());
            jsonDataMapper.insert(jsonData);
        }
        if (StringUtils.isNotBlank(name)) {
            programTemplate.setName(name);
        }
        programTemplate.setImgUrl(imgUrl);
        programTemplate.setUpdateTime(System.currentTimeMillis());
        row = programTemplateMapper.updateByPrimaryKeySelective(programTemplate);
        operationLogService.saveSuccessOperationLog(("修改节目模板，模板名称为:" + programTemplate.getName()),
                (ModuleConstant.MODULE_PROGRAM + "-" + ModuleConstant.MODULE_PROGRAM_TEMPLATE),
                loginUser.getUser(), loginUser.getIp());
        return row;
    }
}
